package infbmobile.bluetooth;

// Importaciones externas
import javax.bluetooth.*;
import javax.microedition.io.*;
import java.io.*;

// Importaciones internas
import infbmobile.util.*;
import infbmobile.errores.*;

public class HebraCliente implements Runnable {

    /**
     *  Identificador del servicio de simulacion
     */
    public static final UUID SERVICIO_BIOMETRICO=new UUID("F0E0D0C0B0A000908070605040302010", false);

    private int parametroBio;
    private int medida;
    private Thread hiloCliente;
    private LocalDevice dispositivo;
    private DiscoveryAgent buscador;
    private String urlServicio;
    private StreamConnection servidor;

    /**
     * Constructor principal de la clase
     */
    public HebraCliente(int parametroBio,int medida) {
        this.parametroBio=parametroBio;
        this.medida=medida;
        hiloCliente=new Thread(this);
        hiloCliente.start();
    }

    public void run() {
        try{
            // Instanciamos los atributos necesarios para iniciar la busqueda del servicio
            dispositivo=LocalDevice.getLocalDevice();
            dispositivo.setDiscoverable(DiscoveryAgent.GIAC);
            buscador=dispositivo.getDiscoveryAgent();
            // Buscamos directamente el servicio de simulacion, sin preocuparnos de en que
            // dispositivo se sirve
            //urlServicio=buscador.selectService(SERVICIO_BIOMETRICO,0,false);
              urlServicio="btspp://001F5B7A3FCA:1;master=false;encrypt=false;authenticate=false";
            // Si se localiza el servicio, nos conectamos a el
            // En caso contrario avisamos al usuario
            if(urlServicio!=null){
                UIHerramientas.mostrarAviso("Intentando conectar...","En este momento el dispositivo movil esta tratando de establecer la conexion con el servidor bluetooth (el pc de sobre mesa)");
                servidor=(StreamConnection)Connector.open(urlServicio);
                UIHerramientas.mostrarAviso("Conexion Realizada","La conexion con el servidor bluetooth se ha realizado con exito.");
                // Abrimos los flujos asociados a la comunicacion con el servidor
                UIHerramientas.mostrarAviso("Apertura de flujos","Una vez realizada la conexion se va a proceder a abrir los canales de flujo de informacion desde y hacia el servidor bluetooth.");
                DataOutputStream salidaHaciaServidor=servidor.openDataOutputStream();
                DataInputStream entradaDesdeServidor=servidor.openDataInputStream();
                UIHerramientas.mostrarAviso("Apertura y Envio", "Los flujos estan ya operativos y el cliente se dispone a enviar el parametro biometrico seleccionado y su medida introducida");
                // Enviamos un dato de prueba al servidor bluetooth
                salidaHaciaServidor.writeInt(parametroBio);
                salidaHaciaServidor.writeInt(medida);
                salidaHaciaServidor.flush();
                UIHerramientas.mostrarAviso("Envio realizado..","En este momento el envio de informacion ya se ha realizado y el cliente se encuentra esperando que el servidor la procese y envie una respuesta");
                // Recogemos la respuesta del servidor bluetooth
                String respuesta=entradaDesdeServidor.readUTF();
                UIHerramientas.mostrarAviso("Respuesta OK","La respuesta del servidor es: "+respuesta);
                // Cerramos los flujos utilizados
                salidaHaciaServidor.close();
                entradaDesdeServidor.close();
                // Cerramos la conexion con el servidor
                servidor.close();
            }else{
                UIHerramientas.mostrarAviso("Error","No se encontro el servicio bluetooth buscado");
            }
        }catch(BluetoothStateException bse){
            UIHerramientas.mostrarAviso("Error de Bluetooth",bse.getMessage());
            throw new MovilException("Error: Se produjo un error al arrancar el proceso de conexion bluetooth del cliente => "+"Clase: "+bse.getClass()+", Mensaje: "+bse.getMessage());
        }catch(IOException ioe){
            UIHerramientas.mostrarAviso("Error de EntradaSalida",ioe.getMessage());
            throw new MovilException("Error: Se produjo un error al arrancar el proceso de conexion bluetooth del cliente => "+"Clase: "+ioe.getClass()+", Mensaje: "+ioe.getMessage());
        }catch(Exception e){
            UIHerramientas.mostrarAviso("Error Generico",e.toString());
            throw new MovilException("Error: Se produjo un error al arrancar el proceso de conexion bluetooth del cliente => "+"Clase: "+e.getClass()+", Mensaje: "+e.getMessage());
        }
    }
}
